﻿using DAL.EstRec;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final_VA_2012.DAL
{
    public static class FuncionesEscalares
    {
        /// <summary>
        /// Funcion que regresa el número de caracteres que contiene una cadena.
        /// </summary>
        /// <param name="vcCadena">Cadena a contar</param>
        /// <param name="vCadenaABuscar">Cadena que contiene el caracter</param>
        /// <returns></returns>
        public static int fiContadorDeCadenas(string vcCadena, string vCadenaABuscar)
        {
            return TextTool.CountStringOccurrences(vcCadena, vCadenaABuscar);
        }

        /// <summary>
        /// Funcion que realiza la conversion de una cantidad dependiendo la moneda en que se encuentren
        /// </summary>
        /// <param name="IdMonedaOrigen"></param>
        /// <param name="IdMonedaDestino"></param>
        /// <param name="nTipoCambio"></param>
        /// <param name="nMontoPorAplicar"></param>
        /// <returns></returns>
        public static double fnVrCalculaMontoParidad(int IdMonedaOrigen, int IdMonedaDestino, double nTipoCambio, double nMontoPorAplicar) { 
        
            int iIdMonedaBase;
            int iIdMonedaConversion;
            double nTipoCambioConversion;
            double nMontoConvertido;
            int iRedondeo;
  
            //Iniciamos variable de redondeo 
            iRedondeo = 2;
 
            //Obtenemos la moneda base 
            iIdMonedaBase = 2; //PESOS

            //Una de las monedas es la base
            nMontoConvertido = nMontoPorAplicar;
            //Asignamos la moneda de conversion
            if (IdMonedaOrigen == iIdMonedaBase )
                iIdMonedaConversion = IdMonedaDestino;
            else
                iIdMonedaConversion = IdMonedaOrigen;

            //Obtenemos el tipo de cambio
            nTipoCambioConversion = nTipoCambio;

            //Verificamos la moneda origen y la del destino
            if(IdMonedaOrigen == iIdMonedaBase && IdMonedaDestino != iIdMonedaBase){
              
                //Origen en Moneda Base y Destino en otra moneda
                nMontoConvertido = Math.Round(nMontoConvertido / nTipoCambioConversion, iRedondeo);
            } else if(IdMonedaOrigen != iIdMonedaBase && IdMonedaDestino == iIdMonedaBase){
            
                //Origen en Otra Moneda y Destino en Moneda base
                nMontoConvertido = Math.Round(nMontoConvertido * nTipoCambioConversion, iRedondeo);
            }

            return nMontoConvertido;
        }

        /// <summary>
        /// Funcion que obtiene el Nodo de la marca apartir de un clave de vehiculo
        /// </summary>
        /// <param name="sClaveVehiculo"></param>
        /// <returns></returns>
        public static int fnVrObtenNodoMarca(string sClaveVehiculo)
        {         
            string Query = @"
            
                Select max(IdNodoOrigen)
		            From dbo.ctArbolActivo
			        Where ArAcClave = '"+sClaveVehiculo+@"'
            ";

            DataTable ds = SrvDB.ExecuteQuery(Query);
  
	        return Int32.Parse(ds.Rows[0][0].ToString());
        }

        /// <summary>
        /// Funcion que obtiene el tipo de cambio de PESOS por DOLAR
        /// </summary>
        /// <param name="IdMoneda">Identificador de moneda</param>
        /// <param name="dtFechaOperacion"></param>
        /// <returns></returns>
        public static double fnVrObtenTipoCambio(int IdMoneda, DateTime dtFechaOperacion)
        { 
        
            int iUsoMoneda = 0;
            double nParidad = 0;

            string Query = @"
            
                Select TpCmValor 
                    From dbo.ctTipoCambio
                    Where Month(TpCmFecha) = " + dtFechaOperacion.Month + @"
               And Year(TpCmFecha) = " + dtFechaOperacion.Year + @"
               And IdMoneda = " + IdMoneda;
           
            DataTable ds = SrvDB.ExecuteQuery(Query);
  
	        return Double.Parse(ds.Rows[0][0].ToString());           
        }

        /// <summary>
        /// Funcion que obtiene el valor de un parametro de sistema
        /// </summary>
        /// <param name="IdSistema">Identificador del sistema</param>
        /// <param name="IdParametroSistema">Identificador del parámetro</param>
        /// <returns>Valor del parametro     |     Vacio - en caso de Error</returns>
        public static string fvcVrObtenParametroSistema(int IdSistema, int IdParametroSistema)
        { 
            string Query = @"
            
                If Exists ( Select PrSsValor
                            From dbo.ctParametroSistema 
                            Where IdSistema = " + IdSistema + @"
                             And IdParametroSistema = " + IdParametroSistema + @" )
                Begin
                  
                  Select PrSsValor
                    From dbo.ctParametroSistema 
                   Where IdSistema = " + IdSistema + @"
                     And IdParametroSistema = " + IdParametroSistema + @" 

                End Else Begin

                    SELECT ''
                End";
           
            DataTable ds = SrvDB.ExecuteQuery(Query);
  
	        return ds.Rows[0][0].ToString();   
        }

        /// <summary>
        /// Funcion que obtiene los sinonimos de la palabra solicitada
        /// </summary>
        /// <param name="cPalabra">Palabra a buscar</param>
        /// <returns>Sinonimos de la plabra</returns>
        public static string fvcVrObtenSinonimo(string cPalabra)
        {            
            string cSinonimos = "";           

            string Query = @"
            
               Select D.DcDescripcion
               From   dbo.ctSinonimo S, dbo.ctDiccionario D
               Where  D.IdDiccionario = S.IdSinonimo
               And    S.IdDiccionario=(Select IdDiccionario 
                                       From dbo.ctDiccionario 
                                       Where  DcDescripcion = '"+cPalabra+@"')
               Order by LEN (D.DcDescripcion) desc";
           
            DataTable ds = SrvDB.ExecuteQuery(Query);
  
	        for(int i = 0; i < ds.Rows.Count; i++){
            
                cSinonimos += ds.Rows[i][0].ToString().TrimEnd() + "|";
            }

            cSinonimos += cPalabra + "|";

            return cSinonimos;
        }

        /// <summary>
        /// Funcion que obtiene los sinonimos de la palabra solicitada
        /// </summary>
        /// <param name="cPalabra">Palabra a buscar</param>
        /// <returns>Sinonimos de la plabra</returns>
        public static string fvcVrObtenSinonimoPalabras(string cPalabra)
        {
            string vcValor;
            string cSinonimos;
            int iCuetaEspacio;
              
            vcValor = "";
            cSinonimos = "";
            iCuetaEspacio = 0;

              
             string Query = @"
            
               Select D.DcDescripcion
               From   dbo.ctSinonimo S, dbo.ctDiccionario D
               Where  D.IdDiccionario = S.IdSinonimo
               And    S.IdDiccionario=(Select IdDiccionario 
                                       From dbo.ctDiccionario 
                                       Where  DcDescripcion = '"+cPalabra+@"')
               Order by LEN (D.DcDescripcion) desc";
           
            DataTable ds = SrvDB.ExecuteQuery(Query);

            for(int i = 0; i < ds.Rows.Count; i++){
            
                cSinonimos = ds.Rows[i][0].ToString();

                while (!cSinonimos.Equals("")) {

                    iCuetaEspacio = cSinonimos.IndexOf(" ");
                    if (iCuetaEspacio != -1)
                    {
                        cPalabra = cSinonimos.Substring(0, iCuetaEspacio + 1).TrimEnd();
                        cSinonimos= cSinonimos.Substring(iCuetaEspacio, cSinonimos.Length-iCuetaEspacio);
                    }
                    else 
                    {
                        cPalabra = cSinonimos;
                        cSinonimos = "";
                    }

                    vcValor = vcValor + cPalabra.TrimEnd() + "|";
                }
            }

            return vcValor;
        }
    }

    public static class TextTool
    {
        /// <summary>
        /// Cuenta el número de apariciones de un cadena en otra 
        /// </summary>
        public static int CountStringOccurrences(string text, string pattern)
        {            
            int count = 0;
            int i = 0;
            while ((i = text.IndexOf(pattern, i)) != -1)
            {
                i += pattern.Length;
                count++;
            }
            return count;
        }
    }
}
